package com.hmall.item.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmall.common.dto.ItemDTO;
import com.hmall.common.dto.PageResult;
import com.hmall.item.mapper.ItemMapper;
import com.hmall.item.pojo.Item;
import com.hmall.item.service.ItemService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


@Service
public class IItemService extends ServiceImpl<ItemMapper, Item> implements ItemService {
    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private RabbitTemplate rabbitTemplate;



    /**
     * 分页查询商品
     *
     * @param page  页码
     * @param size  每页显示的条数
     * @return  分页结果对象
     */
    @Override
    public PageResult findItem(Integer page, Integer size) {
        //1.判断参数
        if (page == null) {
            page = 1;
        }
        if (size == null) {
            size = 5;
        }

        //2.查询分页操作
        IPage<Item> ipage = new Page<>(page, size);

        //2.1查询条件，根据时间倒叙展示
        LambdaQueryWrapper<Item> queryWrapper = Wrappers.<Item>lambdaQuery();
        queryWrapper.orderByDesc(Item::getCreateTime);
        ipage = page(ipage, null);

        //3.封装数据
        PageResult pageResult = new PageResult();
        pageResult.setTotal(ipage.getTotal());
        pageResult.setList(ipage.getRecords());

        return pageResult;
    }

    /**
     * 根据id查询商品详情
     * @param id 商品id
     * @return 商品详情
     */
    @Override
    public ItemDTO findItemById(Long id) throws InvocationTargetException, IllegalAccessException {
        //1.查询商品
        Item item = getById(id);
        //2.封装数据
        ItemDTO itemDTO = new ItemDTO();
        BeanUtils.copyProperties(item, itemDTO);
        //3.返回数据
        return itemDTO;
    }

    /**
     * 新增商品
     * @param itemDTO
     * @return void
     */
    @Override
    @Transactional
    public void saveItem(ItemDTO itemDTO) {
        //1.封装数据
        Item item = new Item();

        //2.拷贝数据
        BeanUtils.copyProperties(item, itemDTO);
        //2.2设置创建时间和更新时间
        item.setCreateTime(new Date());
        item.setUpdateTime(new Date());
        //3.保存数据
        save(item);
        //4.返回消息
        Map message = new HashMap<>();
        message.put("id", item.getId());
        message.put("status", item.getStatus());
        //5.rabbitmq发送消息
        rabbitTemplate.convertAndSend("down_or_up_exchange","downOrUp", JSON.toJSONString(message));
    }
    /**
     * 修改商品
     *
     * @param itemDTO 商品信息
     * @return void
     */
    @Override
    public void updateItem(ItemDTO itemDTO) {
        //1.封装数据
        Item item = new Item();
        //2.拷贝数据
        BeanUtils.copyProperties(item, itemDTO);
        //2.2设置更新时间
        item.setCreateTime(new Date());
        //3.修改数据
        updateById(item);
        //4.返回消息
        Map message = new HashMap<>();
        message.put("id", item.getId());
        message.put("status", item.getStatus());
        //5.rabbitmq发送消息
        rabbitTemplate.convertAndSend("down_or_up_exchange","downOrUp", JSON.toJSONString(message));
    }

    /**
     * 根据id修改商品状态
     *
     * @param id
     * @param status
     */
    @Override
    public void updateItemStatus(Long id, Integer status) {
        //1.通过id查询商品
        Item item = getById(id);
        //2.修改商品状态
        //2.1如果商品状态为1，修改为0，如果商品状态为0，修改为1
        if (item.getStatus() == 1) {
            item.setStatus(2);
        } else {
            item.setStatus(1);
        }
        //2.2设置更新时间
        item.setUpdateTime(new Date());
        //3.修改数据
        updateById(item);
        //4.返回消息
        Map message = new HashMap<>();
        message.put("id", item.getId());
        message.put("status", item.getStatus());
        //5.rabbitmq发送消息
        rabbitTemplate.convertAndSend("down_or_up_exchange","downOrUp", JSON.toJSONString(message));
    }

    /**
     * 删除商品
     * @param id
     */
    @Override
    public void deleteItemById(Long id) {
        //1.删除商品
        removeById(id);
        //2.返回消息
        Map message = new HashMap<>();
        message.put("id", id);
        message.put("status", 2);
        //3.rabbitmq发送消息
        rabbitTemplate.convertAndSend("down_or_up_exchange","downOrUp", JSON.toJSONString(message));
    }
}
